﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace TP2.Lib
{
     [Serializable]
    public class Bombardero : AvionEnemigo
    {
        const int VIDA_MAX_BOMBARDERO = 75,
                  VIDA_BOMBARDERO = 75,
                  RAPIDEZ_BOMBARDERO = 1,
                  RADIO_BOMBARDERO = 27,
                  DELTA_TIEMPO = 80,
                  PTOS_X_DESTRUC_BOMBARDERO = 30;

        #region /*------------ Propiedades ----------------------*/
       
        private double[] _posicionContrarioCercana = new double[3];
        public double[] PosicionContrarioCercana
        {
            get { return this._posicionContrarioCercana; }
            set { this._posicionContrarioCercana = value; }
        }
       
        #endregion

        private Bombardero() { } /*Contructor vacio, lo utiliza la serialización*/

        public Bombardero(double[] posicionInicial, int cantidadDeRebotes, List<ElementoJuego> vehiculosAliados, int[] dimensiones)
            : base(posicionInicial, dimensiones)
        {
            LanzaTorpedoRastreador lanzaTorpedoR = new LanzaTorpedoRastreador(posicionInicial, dimensiones);
            LanzaCohete lanzaCohete = new LanzaCohete(posicionInicial, dimensiones);
            LanzaLaser lanzaLaser = new LanzaLaser(posicionInicial, dimensiones);
            this.AgregarArma(lanzaLaser);
            this.AgregarArma(lanzaCohete);
            this.AgregarArma(lanzaTorpedoR);
            this.VariableDisparo = 0;
            this.EsGuia = false;
            this.VidaMaxima = VIDA_MAX_BOMBARDERO;
            this.Vida = VIDA_BOMBARDERO;
            this.Rapidez = RAPIDEZ_BOMBARDERO;
            this.Radio = RADIO_BOMBARDERO;
            this.PuntosPorDestruccion = PTOS_X_DESTRUC_BOMBARDERO;
            this.EstaHuyendo = false;
            this.Dimensiones = dimensiones;
            this.Recorrido = new MovimientoLineal(posicionInicial, cantidadDeRebotes, this);
            this.FlotaALaQuePertenece = null;            
            //TODO agregarlo a los test

            //No me parece que lo tenga que hacer el constructor
            this.PosicionContrarioCercana = this.BuscarDistanciaMinimaContrario(vehiculosAliados); 
            //lo crea con la informacion de en donde esta el Algo42 para que al disparar el torpedo rastreador este pueda saber a quien rastrear
        }

        /*Metodos abstractos heredados: obligados a definirlos*/

        public override Proyectil Actuar()
        {
            Proyectil unProyectil;
            this.Mover();

            if (!this.EstaHuyendo)
             {
                unProyectil = this.Disparar();
                //unProyectil.VengoDeEnemigo = true;
                return unProyectil;
             }

             return null;
        }

        public override ElementoJuego MeMori()
        {
            int temp;
            Random rand = new Random();
            temp =  rand.Next(1, (this.Armas.Count+1)); 

            if (temp == 1)
            {
                LanzaLaser laserDejado = new LanzaLaser(this.Posicion,this.Dimensiones);
                return (laserDejado);
            }
            else if (temp == 2)
            {
                LanzaCohete coheteDejado = new LanzaCohete(this.Posicion,this.Dimensiones);
                return(coheteDejado);
            }
            else if (temp == 3)
            {
                LanzaTorpedoRastreador torpedoRastreadorDejado = new LanzaTorpedoRastreador(this.Posicion,this.Dimensiones);
                return (torpedoRastreadorDejado);
            }
            return (null);
        }

        //public override void AgregateALista(ArrayList lista1, ArrayList lista2)
        //{
        //    lista2.Add(this);
        //}

        public override void SetearPosicionContrarioCercana(List<ElementoJuego> vehiculosAliados)
        {
            this.PosicionContrarioCercana = this.BuscarDistanciaMinimaContrario(vehiculosAliados);
        }



        #region /*--------- Metodos Privados ------------*/

        private void Mover()
        {
            double[] posicion = new double[3];
            posicion = this.Recorrido.GetSiguientePunto(this.Posicion);

            if (((this.Dimensiones[0] - this.Radio) <= this.Posicion[0]) | (this.Posicion[0] <= this.Radio))
            {
                ((MovimientoLineal)this.Recorrido).VelocidadX = (((MovimientoLineal)this.Recorrido).VelocidadX) * (-1);
            }

            if (((this.Dimensiones[1] - this.Radio) <= this.Posicion[1]) | (this.Posicion[1] <= this.Radio))
            {
                ((MovimientoLineal)this.Recorrido).VelocidadY = (((MovimientoLineal)this.Recorrido).VelocidadY) * (-1);
            }

            this.Posicion = posicion;
        }
        
        private Proyectil Disparar()
        {
            double[] posicionInicialProyectil = new double[3];
            double[] posicionFinalProyectil = new double[3];

            Proyectil proyectil;

            posicionInicialProyectil[0] = this.Posicion[0]; // +1.5 * this.Radio; //Ajuste
            posicionInicialProyectil[1] = this.Posicion[1];

            posicionFinalProyectil[0] = this.Posicion[0];
            posicionFinalProyectil[1] = this.Dimensiones[1];// Cambie 0 por this.Dimensiones[1]


            VariableDisparo = VariableDisparo + 1;

            if ((!this.EstaHuyendo) & (this.VariableDisparo > DELTA_TIEMPO))
            {
                /*VariableDisparo = 0;
                proyectil = this.Armas.ElementAt(1).Disparar(posicionInicialProyectil, this.PosicionContrarioCercana);
                return (proyectil);
                */
                int temp;
                Random rand = new Random();
                temp = rand.Next(0, (this.Armas.Count));

                if (temp == 2)
                {
                    //Caso Particular del TorpedoRastreador
                    VariableDisparo = 0;
                    proyectil = this.Armas.ElementAt(temp).Disparar(posicionInicialProyectil, this.PosicionContrarioCercana);
                    if (proyectil != null)
                    {
                        proyectil.VengoDeEnemigo = true;
                    }
                    return(proyectil);
                }
                else
                {
                    VariableDisparo = 0;
                    proyectil = this.Armas.ElementAt(temp).Disparar(posicionInicialProyectil, posicionFinalProyectil);
                    if (proyectil != null)
                    {
                        proyectil.VengoDeEnemigo = true;
                    }
                    return (proyectil);
                }
            }
            return (null); //Cambie proyectil por null
            //TODO ver q de todas formas esta devolviendo siemrpe un proyectil, adentro el if esta de mas
        }

        #endregion

    }
}
